Essay

Normal Distribution

\[ f(x)=\frac{1}{\sigma\sqrt{2\pi}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) \] The normal distribution is one of the most fundamental distributions in statistics. It has a bell-shaped curve and is perfectly symmetric about its center. It is unimodal, meaning it has only one peak. In a normal distribution, the mean, median, and mode are all equal and are located at the center, with 50% of the observations falling to the left and 50% to the right.

Any normal distribution can be standardized into a standard normal distribution, which has a mean of 0 and a standard deviation of 1. This makes it especially useful for probability calculations and statistical analysis. According to the Empirical Rule, approximately 68% of observations fall within one standard deviation of the mean, about 95% within two standard deviations, and about 99.7% within three standard deviations.

The total area under the normal curve is equal to 1, representing the total probability. The distribution is continuous and extends from negative infinity to positive infinity. It is fully described by two parameters: the mean, which determines the center, and the standard deviation, which determines the spread. \[ X \sim N(\mu, \sigma^2) \] If the population is normally distributed, then the distribution of the sample mean is also normal. Even better, the Central Limit Theorem states that even if the population distribution is unknown, as long as the sample size is large enough, the distribution of the sample mean will be approximately normal. This is very helpful for z-tests, confidence intervals, and hypothesis tests about the mean. \[ \bar{X} \sim N\!\left(\mu,\; \frac{\sigma^2}{n}\right) \]

T-distribution

The t-distribution is very similar in shape to the standard normal distribution, but it has heavier tails. The standard normal distribution \(N(0, 1)\) is commonly used to obtain z-scores for statistical tests when the population standard deviation is known. However, in most real statistical problems, the population variance is unknown and must be estimated from the sample.

Because this estimation introduces additional uncertainty, the t-distribution accounts for it by having wider tails than the normal distribution. This means that extreme values are more likely under the t-distribution than under the standard normal distribution. As a result, hypothesis tests using the t-distribution are more conservative, making it harder to incorrectly reject the null hypothesis.

x <- seq(-4, 4, length = 400)

y_norm <- dnorm(x)
y_t <- dt(x, df = 5)
y_tt <- dt(x, df = 10)

comparison.df <- data.frame(
  x = rep(x, 3),
  density = c(y_norm, y_t, y_tt),
  distribution = factor(rep(c("Normal", "t (df = 5)", "t (df = 10)"), each = length(x)))
)


t.plt <- ggplot(comparison.df, aes(x = x, y = density, color = distribution)) +
  geom_line(size = 1) +
  labs(title = "t-Distribution vs Normal Distribution",
       x = "Value", y = "Density") +
    theme(plot.title = element_text(hjust = 0.5),
        plot.margin = margin(t = 35, r = 20, b = 30, l = 30, unit = "pt")) +
   scale_color_manual(values = c("red", "blue", "green"))
ggplotly(t.plt)

Although the Central Limit Theorem allows the normal distribution to be used when the sample size is large, this approximation is not always appropriate, especially for small samples. In these situations, the t-distribution is necessary.

The t-distribution is characterized by one parameter called the degrees of freedom (v), which is typically equal to n−1. The degrees of freedom determine how heavy the tails are. As the sample size increases, the degrees of freedom increase, and the t-distribution approaches the standard normal distribution. \[ T \sim t_\nu \] When the population is normally distributed but the population standard deviation is unknown, the standardized sample mean follows a t-distribution instead of a normal distribution. When the sample size is small, this accounts for the extra uncertainty from estimating the standard deviation using the sample. As the sample size increases, the t-distribution becomes closer to the normal distribution. This is very helpful for t-tests and confidence intervals about the mean when standard deviation is unknown. \[ T = \frac{\bar{X} - \mu}{S / \sqrt{n}} \sim t_{\,n-1} \]

Chi-squared distribution

The chi-squared distribution is primarily used for hypothesis testing with categorical data or counts. It is commonly used for goodness-of-fit tests, which examine how well observed data match expected values, and for tests of independence, which determine whether two categorical variables are related. The shape of the chi-squared distribution depends on the number of degrees of freedom, and it becomes more symmetric as the degrees of freedom increase.

In addition, the chi-squared distribution plays an important role when working with normally distributed data. If data comes from a normal population, then after proper scaling, the sample variance follows a chi-squared distribution. Suppose we have k independent standard normal random variables. If we square each one and add them together, the resulting sum, called Q, follows a chi-squared distribution with k degrees of freedom. \[ Q=\sum_{i=1}^k Z_i^2 \sim \chi_k^2. \] This result is important because any normally distributed variable can be converted into a standard normal variable using a z-score. After standardizing the data, we can square these values and sum them, which produces a chi-squared distribution. Because sample variance is based on squared deviations from the mean, it can be standardized in a similar way, and the resulting statistic also follows a chi-squared distribution. \[ \frac{(n-1)S^2}{\sigma^2} \sim \chi_{n-1}^2. \] As a result, we can use the chi-squared distribution to construct confidence intervals for the population variance, test hypotheses about variance, and help derive the t-distribution, which will be discussed in the next section.

F-distribution

Similar to the chi-squared distribution, the F distribution is right-skewed, non-negative, and defined on the interval \([0, \infty)\). Its shape depends on two degrees of freedom. The F distribution is mainly used to compare two sources of variation, especially when comparing explained variation to unexplained variation in regression, or when comparing two population variances.

The F distribution is formed by taking the ratio of two independent sample variances that come from normal populations. Since sample variances follow chi-squared distributions, their properly scaled ratio follows an F distribution. As a result, the F distribution can be used to test whether two population variances are equal. For example, if two classes take the same exam but one class has much less variation in scores than the other, this may suggest that the two classes are not performing under the same conditions. An F-test can be used to determine whether the difference in variances is likely due to random chance or reflects a real difference. \[ F = \frac{S_1^2/\sigma_1^2}{S_2^2/\sigma_2^2} \sim F_{n_1-1,\; n_2-1} \] In regression and ANOVA, the F statistic is calculated as the ratio of explained variation vs unexplained variation, MSR/MSE. If the model explains little more than random noise, the F value will be close to 1. If the model explains a large amount of variation, the F value will be much larger than 1. This helps you evaluate how good of a fit your model is. Therefore, the F distribution is used to determine whether observed patterns in the data are likely due to real relationships or simply due to random variation. \[ F = \frac{MSR}{MSE} \sim F_{p,\; n-p-1} \] Therefore, the F distribution is used to determine whether observed patterns in the data are likely due to real relationships or simply due to random variation.

LS0tCnRpdGxlOiAiQXNzaWdubWVudCAyOiBEaXN0cmlidXRpb25zIgphdXRob3I6ICJDaGFybGllIE1vcmdhbiIKZGF0ZTogIiBEdWU6IDAyLzEwLzI2IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdG9jX2NvbGxhcHNlZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgc21vb3RoX3Njcm9sbDogeWVzCiAgICB0aGVtZTogbHVtZW4KICBwZGZfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIGZpZ193aWR0aDogMwogICAgZmlnX2hlaWdodDogMwogIHdvcmRfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAga2VlcF9tZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKYGBge2NzcywgZWNobyA9IEZBTFNFfQojVE9DOjpiZWZvcmUgewogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgZm9udC1zaXplOiAxLjJlbTsKICBkaXNwbGF5OiBibG9jazsKICBjb2xvcjogbmF2eTsKICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoKZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLwogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsKICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsKICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7Cn0KCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovCiAgZm9udC1zaXplOiAyMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7Cn0KCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxNXB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IG5hdnk7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICBmb250LXNpemU6IDE4cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIuIjsKCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9CgouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQoKcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCn0KYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IAojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKICAgbGlicmFyeShrbml0cikKfQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpCiAgIGxpYnJhcnkocGFuZGVyKQp9CmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCiAgbGlicmFyeShnZ3Bsb3QyKQp9CmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQogIGxpYnJhcnkodGlkeXZlcnNlKQp9CgppZiAoIXJlcXVpcmUoInBsb3RseSIpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikKICBsaWJyYXJ5KHBsb3RseSkKfQojIyMjCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIAogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLgogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BCiAgICAgICAgICAgICAgICAgICAgICApICAKYGBgCiMjICoqRXNzYXkqKgoKIyBOb3JtYWwgRGlzdHJpYnV0aW9uCjxjZW50ZXI+CiAgPGltZyBzcmM9Imh3Ml9uZC5wbmciIHdpZHRoPSI0NTAiPgo8L2NlbnRlcj4KJCQKZih4KT1cZnJhY3sxfXtcc2lnbWFcc3FydHsyXHBpfX0KXGV4cFxsZWZ0KC1cZnJhY3soeC1cbXUpXjJ9ezJcc2lnbWFeMn1ccmlnaHQpCiQkClRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIGlzIG9uZSBvZiB0aGUgbW9zdCBmdW5kYW1lbnRhbCBkaXN0cmlidXRpb25zIGluIHN0YXRpc3RpY3MuIEl0IGhhcyBhIGJlbGwtc2hhcGVkIGN1cnZlIGFuZCBpcyBwZXJmZWN0bHkgc3ltbWV0cmljIGFib3V0IGl0cyBjZW50ZXIuIEl0IGlzIHVuaW1vZGFsLCBtZWFuaW5nIGl0IGhhcyBvbmx5IG9uZSBwZWFrLiBJbiBhIG5vcm1hbCBkaXN0cmlidXRpb24sIHRoZSBtZWFuLCBtZWRpYW4sIGFuZCBtb2RlIGFyZSBhbGwgZXF1YWwgYW5kIGFyZSBsb2NhdGVkIGF0IHRoZSBjZW50ZXIsIHdpdGggNTAlIG9mIHRoZSBvYnNlcnZhdGlvbnMgZmFsbGluZyB0byB0aGUgbGVmdCBhbmQgNTAlIHRvIHRoZSByaWdodC4KCkFueSBub3JtYWwgZGlzdHJpYnV0aW9uIGNhbiBiZSBzdGFuZGFyZGl6ZWQgaW50byBhIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24sIHdoaWNoIGhhcyBhIG1lYW4gb2YgMCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMS4gVGhpcyBtYWtlcyBpdCBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgcHJvYmFiaWxpdHkgY2FsY3VsYXRpb25zIGFuZCBzdGF0aXN0aWNhbCBhbmFseXNpcy4gQWNjb3JkaW5nIHRvIHRoZSBFbXBpcmljYWwgUnVsZSwgYXBwcm94aW1hdGVseSA2OCUgb2Ygb2JzZXJ2YXRpb25zIGZhbGwgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4sIGFib3V0IDk1JSB3aXRoaW4gdHdvIHN0YW5kYXJkIGRldmlhdGlvbnMsIGFuZCBhYm91dCA5OS43JSB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucy4KClRoZSB0b3RhbCBhcmVhIHVuZGVyIHRoZSBub3JtYWwgY3VydmUgaXMgZXF1YWwgdG8gMSwgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBwcm9iYWJpbGl0eS4gVGhlIGRpc3RyaWJ1dGlvbiBpcyBjb250aW51b3VzIGFuZCBleHRlbmRzIGZyb20gbmVnYXRpdmUgaW5maW5pdHkgdG8gcG9zaXRpdmUgaW5maW5pdHkuIEl0IGlzIGZ1bGx5IGRlc2NyaWJlZCBieSB0d28gcGFyYW1ldGVyczogdGhlIG1lYW4sIHdoaWNoIGRldGVybWluZXMgdGhlIGNlbnRlciwgYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24sIHdoaWNoIGRldGVybWluZXMgdGhlIHNwcmVhZC4KJCQKWCBcc2ltIE4oXG11LCBcc2lnbWFeMikKJCQKSWYgdGhlIHBvcHVsYXRpb24gaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHRoZW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4gaXMgYWxzbyBub3JtYWwuIEV2ZW4gYmV0dGVyLCB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIHN0YXRlcyB0aGF0IGV2ZW4gaWYgdGhlIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIGlzIHVua25vd24sIGFzIGxvbmcgYXMgdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlIGVub3VnaCwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4gd2lsbCBiZSBhcHByb3hpbWF0ZWx5IG5vcm1hbC4gVGhpcyBpcyB2ZXJ5IGhlbHBmdWwgZm9yIHotdGVzdHMsIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBhbmQgaHlwb3RoZXNpcyB0ZXN0cyBhYm91dCB0aGUgbWVhbi4KJCQKXGJhcntYfSBcc2ltIE5cIVxsZWZ0KFxtdSxcOyBcZnJhY3tcc2lnbWFeMn17bn1ccmlnaHQpCiQkCgojIFQtZGlzdHJpYnV0aW9uClRoZSB0LWRpc3RyaWJ1dGlvbiBpcyB2ZXJ5IHNpbWlsYXIgaW4gc2hhcGUgdG8gdGhlIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24sIGJ1dCBpdCBoYXMgaGVhdmllciB0YWlscy4gVGhlIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24gJE4oMCwgMSkkIGlzIGNvbW1vbmx5IHVzZWQgdG8gb2J0YWluIHotc2NvcmVzIGZvciBzdGF0aXN0aWNhbCB0ZXN0cyB3aGVuIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBrbm93bi4gSG93ZXZlciwgaW4gbW9zdCByZWFsIHN0YXRpc3RpY2FsIHByb2JsZW1zLCB0aGUgcG9wdWxhdGlvbiB2YXJpYW5jZSBpcyB1bmtub3duIGFuZCBtdXN0IGJlIGVzdGltYXRlZCBmcm9tIHRoZSBzYW1wbGUuCgpCZWNhdXNlIHRoaXMgZXN0aW1hdGlvbiBpbnRyb2R1Y2VzIGFkZGl0aW9uYWwgdW5jZXJ0YWludHksIHRoZSB0LWRpc3RyaWJ1dGlvbiBhY2NvdW50cyBmb3IgaXQgYnkgaGF2aW5nIHdpZGVyIHRhaWxzIHRoYW4gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoaXMgbWVhbnMgdGhhdCBleHRyZW1lIHZhbHVlcyBhcmUgbW9yZSBsaWtlbHkgdW5kZXIgdGhlIHQtZGlzdHJpYnV0aW9uIHRoYW4gdW5kZXIgdGhlIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24uIEFzIGEgcmVzdWx0LCBoeXBvdGhlc2lzIHRlc3RzIHVzaW5nIHRoZSB0LWRpc3RyaWJ1dGlvbiBhcmUgbW9yZSBjb25zZXJ2YXRpdmUsIG1ha2luZyBpdCBoYXJkZXIgdG8gaW5jb3JyZWN0bHkgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuCgpgYGB7cn0KeCA8LSBzZXEoLTQsIDQsIGxlbmd0aCA9IDQwMCkKCnlfbm9ybSA8LSBkbm9ybSh4KQp5X3QgPC0gZHQoeCwgZGYgPSA1KQp5X3R0IDwtIGR0KHgsIGRmID0gMTApCgpjb21wYXJpc29uLmRmIDwtIGRhdGEuZnJhbWUoCiAgeCA9IHJlcCh4LCAzKSwKICBkZW5zaXR5ID0gYyh5X25vcm0sIHlfdCwgeV90dCksCiAgZGlzdHJpYnV0aW9uID0gZmFjdG9yKHJlcChjKCJOb3JtYWwiLCAidCAoZGYgPSA1KSIsICJ0IChkZiA9IDEwKSIpLCBlYWNoID0gbGVuZ3RoKHgpKSkKKQoKCnQucGx0IDwtIGdncGxvdChjb21wYXJpc29uLmRmLCBhZXMoeCA9IHgsIHkgPSBkZW5zaXR5LCBjb2xvciA9IGRpc3RyaWJ1dGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBsYWJzKHRpdGxlID0gInQtRGlzdHJpYnV0aW9uIHZzIE5vcm1hbCBEaXN0cmlidXRpb24iLAogICAgICAgeCA9ICJWYWx1ZSIsIHkgPSAiRGVuc2l0eSIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKHQgPSAzNSwgciA9IDIwLCBiID0gMzAsIGwgPSAzMCwgdW5pdCA9ICJwdCIpKSArCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCAiYmx1ZSIsICJncmVlbiIpKQpnZ3Bsb3RseSh0LnBsdCkKYGBgCkFsdGhvdWdoIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gYWxsb3dzIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIHRvIGJlIHVzZWQgd2hlbiB0aGUgc2FtcGxlIHNpemUgaXMgbGFyZ2UsIHRoaXMgYXBwcm94aW1hdGlvbiBpcyBub3QgYWx3YXlzIGFwcHJvcHJpYXRlLCBlc3BlY2lhbGx5IGZvciBzbWFsbCBzYW1wbGVzLiBJbiB0aGVzZSBzaXR1YXRpb25zLCB0aGUgdC1kaXN0cmlidXRpb24gaXMgbmVjZXNzYXJ5LgoKVGhlIHQtZGlzdHJpYnV0aW9uIGlzIGNoYXJhY3Rlcml6ZWQgYnkgb25lIHBhcmFtZXRlciBjYWxsZWQgdGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSAodiksIHdoaWNoIGlzIHR5cGljYWxseSBlcXVhbCB0byBu4oiSMS4gVGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSBkZXRlcm1pbmUgaG93IGhlYXZ5IHRoZSB0YWlscyBhcmUuIEFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMsIHRoZSBkZWdyZWVzIG9mIGZyZWVkb20gaW5jcmVhc2UsIGFuZCB0aGUgdC1kaXN0cmlidXRpb24gYXBwcm9hY2hlcyB0aGUgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbi4KJCQKVCBcc2ltIHRfXG51CiQkCldoZW4gdGhlIHBvcHVsYXRpb24gaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYnV0IHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyB1bmtub3duLCB0aGUgc3RhbmRhcmRpemVkIHNhbXBsZSBtZWFuIGZvbGxvd3MgYSB0LWRpc3RyaWJ1dGlvbiBpbnN0ZWFkIG9mIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gV2hlbiB0aGUgc2FtcGxlIHNpemUgaXMgc21hbGwsIHRoaXMgYWNjb3VudHMgZm9yIHRoZSBleHRyYSB1bmNlcnRhaW50eSBmcm9tIGVzdGltYXRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiB1c2luZyB0aGUgc2FtcGxlLiBBcyB0aGUgc2FtcGxlIHNpemUgaW5jcmVhc2VzLCB0aGUgdC1kaXN0cmlidXRpb24gYmVjb21lcyBjbG9zZXIgdG8gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoaXMgaXMgdmVyeSBoZWxwZnVsIGZvciB0LXRlc3RzIGFuZCBjb25maWRlbmNlIGludGVydmFscyBhYm91dCB0aGUgbWVhbiB3aGVuIHN0YW5kYXJkIGRldmlhdGlvbiBpcyB1bmtub3duLgokJApUID0gXGZyYWN7XGJhcntYfSAtIFxtdX17UyAvIFxzcXJ0e259fSBcc2ltIHRfe1wsbi0xfQokJAoKIyBDaGktc3F1YXJlZCBkaXN0cmlidXRpb24KPGNlbnRlcj4KICA8aW1nIHNyYz0iaHcyXzIucG5nIiB3aWR0aD0iNDUwIj4KPC9jZW50ZXI+ClRoZSBjaGktc3F1YXJlZCBkaXN0cmlidXRpb24gaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGh5cG90aGVzaXMgdGVzdGluZyB3aXRoIGNhdGVnb3JpY2FsIGRhdGEgb3IgY291bnRzLiBJdCBpcyBjb21tb25seSB1c2VkIGZvciBnb29kbmVzcy1vZi1maXQgdGVzdHMsIHdoaWNoIGV4YW1pbmUgaG93IHdlbGwgb2JzZXJ2ZWQgZGF0YSBtYXRjaCBleHBlY3RlZCB2YWx1ZXMsIGFuZCBmb3IgdGVzdHMgb2YgaW5kZXBlbmRlbmNlLCB3aGljaCBkZXRlcm1pbmUgd2hldGhlciB0d28gY2F0ZWdvcmljYWwgdmFyaWFibGVzIGFyZSByZWxhdGVkLiBUaGUgc2hhcGUgb2YgdGhlIGNoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbiBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgZGVncmVlcyBvZiBmcmVlZG9tLCBhbmQgaXQgYmVjb21lcyBtb3JlIHN5bW1ldHJpYyBhcyB0aGUgZGVncmVlcyBvZiBmcmVlZG9tIGluY3JlYXNlLgoKSW4gYWRkaXRpb24sIHRoZSBjaGktc3F1YXJlZCBkaXN0cmlidXRpb24gcGxheXMgYW4gaW1wb3J0YW50IHJvbGUgd2hlbiB3b3JraW5nIHdpdGggbm9ybWFsbHkgZGlzdHJpYnV0ZWQgZGF0YS4gSWYgZGF0YSBjb21lcyBmcm9tIGEgbm9ybWFsIHBvcHVsYXRpb24sIHRoZW4gYWZ0ZXIgcHJvcGVyIHNjYWxpbmcsIHRoZSBzYW1wbGUgdmFyaWFuY2UgZm9sbG93cyBhIGNoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbi4gU3VwcG9zZSB3ZSBoYXZlIGsgaW5kZXBlbmRlbnQgc3RhbmRhcmQgbm9ybWFsIHJhbmRvbSB2YXJpYWJsZXMuIElmIHdlIHNxdWFyZSBlYWNoIG9uZSBhbmQgYWRkIHRoZW0gdG9nZXRoZXIsIHRoZSByZXN1bHRpbmcgc3VtLCBjYWxsZWQgUSwgZm9sbG93cyBhIGNoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbiB3aXRoIGsgZGVncmVlcyBvZiBmcmVlZG9tLgokJApRPVxzdW1fe2k9MX1eayBaX2leMiBcc2ltIFxjaGlfa14yLgokJApUaGlzIHJlc3VsdCBpcyBpbXBvcnRhbnQgYmVjYXVzZSBhbnkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgdmFyaWFibGUgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEgc3RhbmRhcmQgbm9ybWFsIHZhcmlhYmxlIHVzaW5nIGEgei1zY29yZS4gQWZ0ZXIgc3RhbmRhcmRpemluZyB0aGUgZGF0YSwgd2UgY2FuIHNxdWFyZSB0aGVzZSB2YWx1ZXMgYW5kIHN1bSB0aGVtLCB3aGljaCBwcm9kdWNlcyBhIGNoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbi4gQmVjYXVzZSBzYW1wbGUgdmFyaWFuY2UgaXMgYmFzZWQgb24gc3F1YXJlZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4sIGl0IGNhbiBiZSBzdGFuZGFyZGl6ZWQgaW4gYSBzaW1pbGFyIHdheSwgYW5kIHRoZSByZXN1bHRpbmcgc3RhdGlzdGljIGFsc28gZm9sbG93cyBhIGNoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbi4gCiQkClxmcmFjeyhuLTEpU14yfXtcc2lnbWFeMn0gXHNpbSBcY2hpX3tuLTF9XjIuCiQkCkFzIGEgcmVzdWx0LCB3ZSBjYW4gdXNlIHRoZSBjaGktc3F1YXJlZCBkaXN0cmlidXRpb24gdG8gY29uc3RydWN0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgcG9wdWxhdGlvbiB2YXJpYW5jZSwgdGVzdCBoeXBvdGhlc2VzIGFib3V0IHZhcmlhbmNlLCBhbmQgaGVscCBkZXJpdmUgdGhlIHQtZGlzdHJpYnV0aW9uLCB3aGljaCB3aWxsIGJlIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgoKIyBGLWRpc3RyaWJ1dGlvbgpTaW1pbGFyIHRvIHRoZSBjaGktc3F1YXJlZCBkaXN0cmlidXRpb24sIHRoZSBGIGRpc3RyaWJ1dGlvbiBpcyByaWdodC1za2V3ZWQsIG5vbi1uZWdhdGl2ZSwgYW5kIGRlZmluZWQgb24gdGhlIGludGVydmFsICRbMCwgXGluZnR5KSQuIEl0cyBzaGFwZSBkZXBlbmRzIG9uIHR3byBkZWdyZWVzIG9mIGZyZWVkb20uIFRoZSBGIGRpc3RyaWJ1dGlvbiBpcyBtYWlubHkgdXNlZCB0byBjb21wYXJlIHR3byBzb3VyY2VzIG9mIHZhcmlhdGlvbiwgZXNwZWNpYWxseSB3aGVuIGNvbXBhcmluZyBleHBsYWluZWQgdmFyaWF0aW9uIHRvIHVuZXhwbGFpbmVkIHZhcmlhdGlvbiBpbiByZWdyZXNzaW9uLCBvciB3aGVuIGNvbXBhcmluZyB0d28gcG9wdWxhdGlvbiB2YXJpYW5jZXMuCgpUaGUgRiBkaXN0cmlidXRpb24gaXMgZm9ybWVkIGJ5IHRha2luZyB0aGUgcmF0aW8gb2YgdHdvIGluZGVwZW5kZW50IHNhbXBsZSB2YXJpYW5jZXMgdGhhdCBjb21lIGZyb20gbm9ybWFsIHBvcHVsYXRpb25zLiBTaW5jZSBzYW1wbGUgdmFyaWFuY2VzIGZvbGxvdyBjaGktc3F1YXJlZCBkaXN0cmlidXRpb25zLCB0aGVpciBwcm9wZXJseSBzY2FsZWQgcmF0aW8gZm9sbG93cyBhbiBGIGRpc3RyaWJ1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBGIGRpc3RyaWJ1dGlvbiBjYW4gYmUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdHdvIHBvcHVsYXRpb24gdmFyaWFuY2VzIGFyZSBlcXVhbC4gRm9yIGV4YW1wbGUsIGlmIHR3byBjbGFzc2VzIHRha2UgdGhlIHNhbWUgZXhhbSBidXQgb25lIGNsYXNzIGhhcyBtdWNoIGxlc3MgdmFyaWF0aW9uIGluIHNjb3JlcyB0aGFuIHRoZSBvdGhlciwgdGhpcyBtYXkgc3VnZ2VzdCB0aGF0IHRoZSB0d28gY2xhc3NlcyBhcmUgbm90IHBlcmZvcm1pbmcgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucy4gQW4gRi10ZXN0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlIGluIHZhcmlhbmNlcyBpcyBsaWtlbHkgZHVlIHRvIHJhbmRvbSBjaGFuY2Ugb3IgcmVmbGVjdHMgYSByZWFsIGRpZmZlcmVuY2UuCiQkCkYgPSBcZnJhY3tTXzFeMi9cc2lnbWFfMV4yfXtTXzJeMi9cc2lnbWFfMl4yfSBcc2ltIEZfe25fMS0xLFw7IG5fMi0xfQokJApJbiByZWdyZXNzaW9uIGFuZCBBTk9WQSwgdGhlIEYgc3RhdGlzdGljIGlzIGNhbGN1bGF0ZWQgYXMgdGhlIHJhdGlvIG9mIGV4cGxhaW5lZCB2YXJpYXRpb24gdnMgdW5leHBsYWluZWQgdmFyaWF0aW9uLCBNU1IvTVNFLiBJZiB0aGUgbW9kZWwgZXhwbGFpbnMgbGl0dGxlIG1vcmUgdGhhbiByYW5kb20gbm9pc2UsIHRoZSBGIHZhbHVlIHdpbGwgYmUgY2xvc2UgdG8gMS4gSWYgdGhlIG1vZGVsIGV4cGxhaW5zIGEgbGFyZ2UgYW1vdW50IG9mIHZhcmlhdGlvbiwgdGhlIEYgdmFsdWUgd2lsbCBiZSBtdWNoIGxhcmdlciB0aGFuIDEuIFRoaXMgaGVscHMgeW91IGV2YWx1YXRlIGhvdyBnb29kIG9mIGEgZml0IHlvdXIgbW9kZWwgaXMuClRoZXJlZm9yZSwgdGhlIEYgZGlzdHJpYnV0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb2JzZXJ2ZWQgcGF0dGVybnMgaW4gdGhlIGRhdGEgYXJlIGxpa2VseSBkdWUgdG8gcmVhbCByZWxhdGlvbnNoaXBzIG9yIHNpbXBseSBkdWUgdG8gcmFuZG9tIHZhcmlhdGlvbi4KJCQKRiA9IFxmcmFje01TUn17TVNFfSBcc2ltIEZfe3AsXDsgbi1wLTF9CiQkClRoZXJlZm9yZSwgdGhlIEYgZGlzdHJpYnV0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb2JzZXJ2ZWQgcGF0dGVybnMgaW4gdGhlIGRhdGEgYXJlIGxpa2VseSBkdWUgdG8gcmVhbCByZWxhdGlvbnNoaXBzIG9yIHNpbXBseSBkdWUgdG8gcmFuZG9tIHZhcmlhdGlvbi4KCgo=